package com.own.business.resource.core.model.base.method;

import com.own.component.common.util.list.ListUtil;

import java.io.File;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.function.Supplier;

/**
 * FolderMethod
 *
 * @author chenxueli
 * @date 2023-07-07 15:41:00
 */
public interface FolderMethod {

    /**
     * 获取文件夹列表
     *
     * @return 文件夹列表
     */
    List<String> getFolderList();

    /**
     * 追加设置文件存放路径
     *
     * @param folder 路径
     */
    default void addFolder(String folder) {
        var folderList = getFolderList();
        folderList.addAll(resolveFolder(folder));
    }

    /**
     * 追加设置文件存放路径
     *
     * @param index  插入的位置
     * @param folder 路径
     */
    default void addFolder(int index, String folder) {
        var folderList = getFolderList();
        var list = resolveFolder(folder);
        Collections.reverse(list);
        list.forEach(f -> {
            folderList.add(index, f);
        });
    }

    /**
     * 获取文件夹
     *
     * @return 文件夹信息
     */
    default String getFolder() {
        return getFolder(File.separator);
    }

    /**
     * 设置文件存放路径
     *
     * @param folder 路径
     */
    default void setFolder(String folder) {
        // 清除数据
        getFolderList().clear();
        // 设置数据
        addFolder(folder);
    }

    /**
     * 获取文件夹
     *
     * @param separator 分隔符
     * @return 文件夹信息
     */
    default String getFolder(String separator) {
        return String.join(separator, getFolderList());
    }

    /**
     * 添加日期文件夹
     */
    default void setDateFolder() {
        setDateFolder(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
    }

    /**
     * 添加日期文件夹
     */
    default void setDateFolder(Supplier<DateTimeFormatter> supplier) {
        setDateFolder(supplier.get());
    }

    /**
     * 添加日期文件夹
     */
    default void setDateFolder(DateTimeFormatter formatter) {
        var date = LocalDate.now();
        clearFolder();
        addFolder(date.format(formatter));
    }

    /**
     * 添加日期文件夹
     */
    default void appendDateFolder() {
        appendDateFolder(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
    }

    /**
     * 添加日期文件夹
     */
    default void appendDateFolder(Supplier<DateTimeFormatter> supplier) {
        appendDateFolder(supplier.get());
    }

    /**
     * 添加日期文件夹
     */
    default void appendDateFolder(DateTimeFormatter formatter) {
        var date = LocalDate.now();
        addFolder(date.format(formatter));
    }

    /**
     * 清除数据
     */
    default void clearFolder() {
        getFolderList().clear();
    }

    /**
     * 解析处理文件夹
     *
     * @param folder 文件夹
     * @return 文件夹列表
     */
    private List<String> resolveFolder(String folder) {
        return ListUtil.Spilt.to(
                folder
                        .replaceAll("\\\\", "/")
                        .replaceAll("/+", "/")
                        .replaceAll("^/+", "")
                        .replaceAll("/+$", ""),
                "/"
        );
    }

}
